package org.Yiran.timetale_re.util.geometry;

import net.minecraft.world.phys.shapes.BooleanOp;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.AABB;

import java.util.List;

/**
 * 体素形状助手类
 * <p>
 * 提供创建和操作VoxelShape的辅助方法，用于从模型数据生成Minecraft中的碰撞箱和显示形状。
 * </p>
 * 
 * @author Yiran
 * @version 1.0
 */
public class VoxelShapeHelper {
    
    /**
     * 从模型元素创建VoxelShape
     * <p>
     * 根据起始和结束坐标创建VoxelShape。坐标值会被转换为0-1范围内的相对坐标，
     * 符合Minecraft中VoxelShape的坐标系统要求。
     * </p>
     * 
     * @param from 起始坐标 [x, y, z]，值域为0-16
     * @param to 结束坐标 [x, y, z]，值域为0-16
     * @return 创建的VoxelShape
     */
    public static VoxelShape createVoxelShape(double[] from, double[] to) {
        double minX = Math.min(from[0], to[0]) / 16.0;
        double minY = Math.min(from[1], to[1]) / 16.0;
        double minZ = Math.min(from[2], to[2]) / 16.0;
        double maxX = Math.max(from[0], to[0]) / 16.0;
        double maxY = Math.max(from[1], to[1]) / 16.0;
        double maxZ = Math.max(from[2], to[2]) / 16.0;
        
        return Shapes.create(new AABB(minX, minY, minZ, maxX, maxY, maxZ));
    }

    /**
     * 合并多个VoxelShape
     * <p>
     * 使用BooleanOp.OR操作符合并多个VoxelShape为一个整体形状。
     * 如果输入列表为空，则返回空形状。
     * </p>
     * 
     * @param shapes VoxelShape列表
     * @return 合并后的VoxelShape
     */
    public static VoxelShape combineShapes(List<VoxelShape> shapes) {
        if (shapes.isEmpty()) {
            return Shapes.empty();
        }

        // 使用更彻底的合并方式
        return shapes.stream().reduce(Shapes.empty(), (a, b) -> Shapes.join(a, b, BooleanOp.OR));
    }
}